package com.Endurancer.manager.utils;

import java.text.SimpleDateFormat;
import java.util.Date;

public class NumberUtils {

    // 自增序列的起始值
    private static long sequence = 1L; // 从1开始

    // 上一次的时间戳
    private static long lastTimestamp = -1L;

    // 生成订单编号的方法
    public static synchronized String generateNumber() {
        // 获取当前时间
        Date now = new Date();
        // 格式化年月日
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        String dateStr = dateFormat.format(now);

        // 获取当前时间戳（秒）
        long timestamp = System.currentTimeMillis() / 1000;

        // 如果当前时间戳小于上一次的时间戳，说明系统时钟回拨，抛出异常
        if (timestamp < lastTimestamp) {
            throw new RuntimeException("Clock moved backwards. Refusing to generate id");
        }

        // 如果当前时间戳等于上一次的时间戳，则增加序列
        if (timestamp == lastTimestamp) {
            sequence = (sequence + 1) & 0xFFF; // 限制序列在1-4095之间
            // 如果序列溢出，则等待下一个毫秒
            if (sequence == 0) {
                timestamp = tilNextMillis(lastTimestamp);
                sequence = 1; // 重置序列为1
            }
        } else {
            // 如果当前时间戳大于上一次的时间戳，重置序列
            sequence = 1L; // 重置序列为1
        }

        // 更新上一次的时间戳
        lastTimestamp = timestamp;

        // 生成8位数字，确保在当天内唯一
        String uniqueNumber = String.format("%08d", timestamp % 100000000); // 取最后8位数字

        // 生成订单编号，格式为：年月日+8位数字+序列号
        return dateStr + uniqueNumber + String.format("%04d", sequence);
    }

    // 等待下一个毫秒
    private static long tilNextMillis(long lastTimestamp) {
        long timestamp = System.currentTimeMillis() / 1000;
        while (timestamp <= lastTimestamp) {
            timestamp = System.currentTimeMillis() / 1000;
        }
        return timestamp;
    }
}
